Micron Document
🎖️GitЯра🎖️

Node / meshtastic / Meshtastic-Android / files / androidApp / src / google / kotlin / org / meshtastic / app / map / offline / pmtiles / component / OfflineRegionManagerSection.kt

Displaying Raw • Download

androidApp/src/google/kotlin/org/meshtastic/app/map/offline/pmtiles/component/OfflineRegionManagerSection.kt renovate/fastlane-2.x-lockfile (056eed64) Text, 17.01 KB

T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.app.map.offline.pmtiles.component

Tff7b72import T7ee787androidx.compose.foundation.layout.Arrangement
Tff7b72import T7ee787androidx.compose.foundation.layout.Column
Tff7b72import T7ee787androidx.compose.foundation.layout.Row
Tff7b72import T7ee787androidx.compose.foundation.layout.fillMaxWidth
Tff7b72import T7ee787androidx.compose.foundation.layout.padding
Tff7b72import T7ee787androidx.compose.material3.Button
Tff7b72import T7ee787androidx.compose.material3.Icon
Tff7b72import T7ee787androidx.compose.material3.IconButton
Tff7b72import T7ee787androidx.compose.material3.LinearProgressIndicator
Tff7b72import T7ee787androidx.compose.material3.MaterialTheme
Tff7b72import T7ee787androidx.compose.material3.Switch
Tff7b72import T7ee787androidx.compose.material3.Text
Tff7b72import T7ee787androidx.compose.material3.TextButton
Tff7b72import T7ee787androidx.compose.runtime.Composable
Tff7b72import T7ee787androidx.compose.ui.Alignment
Tff7b72import T7ee787androidx.compose.ui.Modifier
Tff7b72import T7ee787androidx.compose.ui.unit.dp
Tff7b72import T7ee787com.google.android.gms.maps.model.LatLngBounds
Tff7b72import T7ee787org.jetbrains.compose.resources.stringResource
Tff7b72import T7ee787org.meshtastic.app.map.offline.pmtiles.OfflineDownloadFailure
Tff7b72import T7ee787org.meshtastic.app.map.offline.pmtiles.OfflineDownloadState
Tff7b72import T7ee787org.meshtastic.app.map.offline.pmtiles.OfflineRegion
Tff7b72import T7ee787org.meshtastic.app.map.offline.pmtiles.OfflineRegionExtractor
Tff7b72import T7ee787org.meshtastic.core.common.util.NumberFormatter
Tff7b72import T7ee787org.meshtastic.core.resources.Res
Tff7b72import T7ee787org.meshtastic.core.resources.delete
Tff7b72import T7ee787org.meshtastic.core.resources.map_cache_tiles
Tff7b72import T7ee787org.meshtastic.core.resources.map_download_status_complete
Tff7b72import T7ee787org.meshtastic.core.resources.map_offline_download_failed_build
Tff7b72import T7ee787org.meshtastic.core.resources.map_offline_download_failed_io
Tff7b72import T7ee787org.meshtastic.core.resources.map_offline_download_failed_region_limit
Tff7b72import T7ee787org.meshtastic.core.resources.map_offline_download_failed_storage
Tff7b72import T7ee787org.meshtastic.core.resources.map_offline_download_failed_tile_limit
Tff7b72import T7ee787org.meshtastic.core.resources.map_offline_download_terrain
Tff7b72import T7ee787org.meshtastic.core.resources.map_offline_downloading_progress
Tff7b72import T7ee787org.meshtastic.core.resources.map_offline_manager
Tff7b72import T7ee787org.meshtastic.core.resources.map_offline_region_label
Tff7b72import T7ee787org.meshtastic.core.resources.map_offline_show_on_map
Tff7b72import T7ee787org.meshtastic.core.resources.map_offline_terrain_contours
Tff7b72import T7ee787org.meshtastic.core.resources.map_offline_terrain_download_complete
Tff7b72import T7ee787org.meshtastic.core.resources.map_offline_terrain_download_failed_io
Tff7b72import T7ee787org.meshtastic.core.resources.map_offline_terrain_download_failed_tile_limit
Tff7b72import T7ee787org.meshtastic.core.resources.map_offline_terrain_downloading_progress
Tff7b72import T7ee787org.meshtastic.core.resources.map_overlay_hillshade
Tff7b72import T7ee787org.meshtastic.core.resources.map_select_download_region
Tff7b72import T7ee787org.meshtastic.core.resources.map_start_download
Tff7b72import T7ee787org.meshtastic.core.resources.map_tile_download_estimate
Tff7b72import T7ee787org.meshtastic.core.resources.map_zoom_levels
Tff7b72import T7ee787org.meshtastic.core.resources.offline_maps_empty
Tff7b72import T7ee787org.meshtastic.core.ui.icon.Delete
Tff7b72import T7ee787org.meshtastic.core.ui.icon.MeshtasticIcons
Tff7b72import T7ee787org.meshtastic.feature.map.terrain.TerrainDownloadFailure
Tff7b72import T7ee787org.meshtastic.feature.map.terrain.TerrainDownloadState

T8b949e/** How many zoom levels deeper than the current view a download covers — matches the MapLibre flavor's own choice. */
Tff7b72private Tff7b72const Tff7b72val Te6edf3EXTRA_ZOOM_LEVELS Tff7b72= T79c0ff2
Tff7b72private Tff7b72const Tff7b72val Te6edf3MIN_ZOOM Tff7b72= T79c0ff0
Tff7b72private Tff7b72const Tff7b72val Te6edf3MAX_ZOOM Tff7b72= T79c0ff2T79c0ff0

T8b949e/**
* The Google flavor's offline-regions manager, a section of the layers sheet — the same slot the MapLibre flavor puts
* its own [org.meshtastic.feature.map.maplibre.component.OfflineMapsSection] equivalent in. Not shared code: that
* composable is `internal` to `feature:map-maplibre` and drives MapLibre's native `OfflinePack` API, which has no
* equivalent here — this one drives [org.meshtastic.app.map.offline.pmtiles.OfflineRegionExtractor] instead. The visual
* shape (estimate before download, a start button, a list of downloaded regions with delete) is kept the same on
* purpose, for cross-flavor consistency, which is the design-standards justification for this section not going through
* a full design review as new UI.
*/
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLongParameterListTa5d6ff"Tb4b4b4)
Tf0883e@Composable
Tff7b72internal Tff7b72fun Td2a8ffOfflineRegionManagerSectionTb4b4b4(
Te6edf3visibleBoundsTb4b4b4: Te6edf3LatLngBounds?Tb4b4b4,
Te6edf3currentZoomTb4b4b4: Tffa657IntTb4b4b4,
Te6edf3regionsTb4b4b4: Te6edf3ListTff7b72<Te6edf3OfflineRegionTff7b72>Tb4b4b4,
Te6edf3downloadStateTb4b4b4: Te6edf3OfflineDownloadState?Tb4b4b4,
Te6edf3offlineOverlayEnabledTb4b4b4: Tffa657BooleanTb4b4b4,
Te6edf3estimateTileCountTb4b4b4: Tb4b4b4(Te6edf3LatLngBoundsTb4b4b4, Te6edf3IntRangeTb4b4b4) Tff7b72-Tff7b72> Tffa657LongTb4b4b4,
Te6edf3onDownloadTb4b4b4: Tb4b4b4(Te6edf3LatLngBoundsTb4b4b4, Te6edf3IntRangeTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onDeleteRegionTb4b4b4: Tb4b4b4(Tffa657StringTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onToggleOfflineOverlayTb4b4b4: Tb4b4b4(Tffa657BooleanTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3terrainDownloadStateTb4b4b4: Te6edf3TerrainDownloadState?Tb4b4b4,
Te6edf3terrainDownloadRegionIdTb4b4b4: Tffa657String?Tb4b4b4,
Te6edf3terrainHillshadeEnabledTb4b4b4: Tffa657BooleanTb4b4b4,
Te6edf3terrainContoursEnabledTb4b4b4: Tffa657BooleanTb4b4b4,
Te6edf3onDownloadTerrainTb4b4b4: Tb4b4b4(Tffa657StringTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onToggleHillshadeTb4b4b4: Tb4b4b4(Tffa657BooleanTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onToggleContoursTb4b4b4: Tb4b4b4(Tffa657BooleanTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3zoomRange Tff7b72= Te6edf3currentZoomTb4b4b4.Te6edf3coerceInTb4b4b4(Te6edf3MIN_ZOOMTb4b4b4, Te6edf3MAX_ZOOMTb4b4b4)Tb4b4b4.Te6edf3let Tb4b4b4{ Tffa657itTb4b4b4.Tb4b4b4.Tb4b4b4(Tffa657it Tff7b72+ Te6edf3EXTRA_ZOOM_LEVELSTb4b4b4)Tb4b4b4.Te6edf3coerceAtMostTb4b4b4(Te6edf3MAX_ZOOMTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3estimate Tff7b72= Te6edf3visibleBoundsTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3estimateTileCountTb4b4b4(Tffa657itTb4b4b4, Te6edf3zoomRangeTb4b4b4) Tb4b4b4} Tff7b72?: T79c0ff0L

Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3horizontal Tff7b72= T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4, Te6edf3vertical Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3RowTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3horizontalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3SpaceBetweenTb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3map_offline_managerTb4b4b4)Tb4b4b4, Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3titleMediumTb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3regionsTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3RowTb4b4b4(Te6edf3verticalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterVerticallyTb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3map_offline_show_on_mapTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodySmallTb4b4b4,
Tb4b4b4)
Te6edf3SwitchTb4b4b4(Te6edf3checked Tff7b72= Te6edf3offlineOverlayEnabledTb4b4b4, Te6edf3onCheckedChange Tff7b72= Te6edf3onToggleOfflineOverlayTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Te6edf3TextTb4b4b4(Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3map_select_download_regionTb4b4b4)Tb4b4b4, Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodyMediumTb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72=
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3map_tile_download_estimateTb4b4b4) Tff7b72+
Ta5d6ff"Ta5d6ff Ta5d6ff" Tff7b72+
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3map_cache_tilesTb4b4b4, Te6edf3estimateTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72+
Ta5d6ff"Ta5d6ff Ta5d6ff" Tff7b72+
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3map_zoom_levelsTb4b4b4, Te6edf3zoomRangeTb4b4b4.Te6edf3firstTb4b4b4, Te6edf3zoomRangeTb4b4b4.Te6edf3lastTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodySmallTb4b4b4,
Te6edf3color Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3onSurfaceVariantTb4b4b4,
Tb4b4b4)

Te6edf3DownloadStatusLineTb4b4b4(Te6edf3downloadStateTb4b4b4)

Te6edf3ButtonTb4b4b4(
Te6edf3onClick Tff7b72= Tb4b4b4{ Te6edf3visibleBoundsTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3onDownloadTb4b4b4(Tffa657itTb4b4b4, Te6edf3zoomRangeTb4b4b4) Tb4b4b4} Tb4b4b4}Tb4b4b4,
Te6edf3enabled Tff7b72= Te6edf3visibleBounds Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72& Te6edf3estimate Tff7b72> T79c0ff0L Tff7b72&Tff7b72& Te6edf3downloadState Tff7b72!is Te6edf3OfflineDownloadStateTb4b4b4.Te6edf3InProgressTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3vertical Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3map_start_downloadTb4b4b4)Tb4b4b4)
Tb4b4b4}

Te6edf3DownloadedRegionsListTb4b4b4(
Te6edf3regions Tff7b72= Te6edf3regionsTb4b4b4,
Te6edf3terrainDownloadState Tff7b72= Te6edf3terrainDownloadStateTb4b4b4,
Te6edf3terrainDownloadRegionId Tff7b72= Te6edf3terrainDownloadRegionIdTb4b4b4,
Te6edf3terrainHillshadeEnabled Tff7b72= Te6edf3terrainHillshadeEnabledTb4b4b4,
Te6edf3terrainContoursEnabled Tff7b72= Te6edf3terrainContoursEnabledTb4b4b4,
Te6edf3onDeleteRegion Tff7b72= Te6edf3onDeleteRegionTb4b4b4,
Te6edf3onDownloadTerrain Tff7b72= Te6edf3onDownloadTerrainTb4b4b4,
Te6edf3onToggleHillshade Tff7b72= Te6edf3onToggleHillshadeTb4b4b4,
Te6edf3onToggleContours Tff7b72= Te6edf3onToggleContoursTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLongParameterListTa5d6ff"Tb4b4b4)
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffDownloadedRegionsListTb4b4b4(
Te6edf3regionsTb4b4b4: Te6edf3ListTff7b72<Te6edf3OfflineRegionTff7b72>Tb4b4b4,
Te6edf3terrainDownloadStateTb4b4b4: Te6edf3TerrainDownloadState?Tb4b4b4,
Te6edf3terrainDownloadRegionIdTb4b4b4: Tffa657String?Tb4b4b4,
Te6edf3terrainHillshadeEnabledTb4b4b4: Tffa657BooleanTb4b4b4,
Te6edf3terrainContoursEnabledTb4b4b4: Tffa657BooleanTb4b4b4,
Te6edf3onDeleteRegionTb4b4b4: Tb4b4b4(Tffa657StringTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onDownloadTerrainTb4b4b4: Tb4b4b4(Tffa657StringTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onToggleHillshadeTb4b4b4: Tb4b4b4(Tffa657BooleanTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onToggleContoursTb4b4b4: Tb4b4b4(Tffa657BooleanTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3regionsTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3offline_maps_emptyTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodyMediumTb4b4b4,
Te6edf3color Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3onSurfaceVariantTb4b4b4,
Tb4b4b4)
Tff7b72return
Tb4b4b4}

T8b949e// The shared budget covers every region's base archive plus any terrain already attached to it — see
T8b949e// OfflineRegionStore.totalBytes, which this mirrors without a store call from composition.
Tff7b72val Te6edf3terrainStorageAvailable Tff7b72=
Te6edf3regionsTb4b4b4.Te6edf3sumOf Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3byteSize Tff7b72+ Tffa657itTb4b4b4.Te6edf3terrainByteSize Tb4b4b4} Tff7b72< Te6edf3OfflineRegionExtractorTb4b4b4.Te6edf3MAX_TOTAL_BYTES
T8b949e// terrainDownloadRegionId outlives its job (it keeps the result line on that row until the sheet closes), so
T8b949e// "running" is that plus a non-terminal state. One terrain job at a time — every other row's button waits.
Tff7b72val Te6edf3terrainDownloadRunning Tff7b72=
Te6edf3terrainDownloadRegionId Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72&
Te6edf3terrainDownloadState Tff7b72!is Te6edf3TerrainDownloadStateTb4b4b4.Te6edf3Complete Tff7b72&Tff7b72&
Te6edf3terrainDownloadState Tff7b72!is Te6edf3TerrainDownloadStateTb4b4b4.Te6edf3Failed
Te6edf3regionsTb4b4b4.Te6edf3forEach Tb4b4b4{ Te6edf3region Tff7b72-Tff7b72>
Te6edf3OfflineRegionRowTb4b4b4(
Te6edf3region Tff7b72= Te6edf3regionTb4b4b4,
Te6edf3onDelete Tff7b72= Tb4b4b4{ Te6edf3onDeleteRegionTb4b4b4(Te6edf3regionTb4b4b4.Te6edf3idTb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3terrainDownloadEnabled Tff7b72= Te6edf3terrainStorageAvailable Tff7b72&Tff7b72& Tff7b72!Te6edf3terrainDownloadRunningTb4b4b4,
Te6edf3terrainDownloadState Tff7b72= Te6edf3terrainDownloadStateTb4b4b4.Te6edf3takeIf Tb4b4b4{ Te6edf3terrainDownloadRegionId Tff7b72=Tff7b72= Te6edf3regionTb4b4b4.Te6edf3id Tb4b4b4}Tb4b4b4,
Te6edf3isDownloadingTerrain Tff7b72= Te6edf3terrainDownloadRegionId Tff7b72=Tff7b72= Te6edf3regionTb4b4b4.Te6edf3idTb4b4b4,
Te6edf3terrainHillshadeEnabled Tff7b72= Te6edf3terrainHillshadeEnabledTb4b4b4,
Te6edf3terrainContoursEnabled Tff7b72= Te6edf3terrainContoursEnabledTb4b4b4,
Te6edf3onDownloadTerrain Tff7b72= Tb4b4b4{ Te6edf3onDownloadTerrainTb4b4b4(Te6edf3regionTb4b4b4.Te6edf3idTb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3onToggleHillshade Tff7b72= Te6edf3onToggleHillshadeTb4b4b4,
Te6edf3onToggleContours Tff7b72= Te6edf3onToggleContoursTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffDownloadStatusLineTb4b4b4(Te6edf3stateTb4b4b4: Te6edf3OfflineDownloadState?Tb4b4b4) Tb4b4b4{
Tff7b72when Tb4b4b4(Te6edf3stateTb4b4b4) Tb4b4b4{
Tff7b72null Tff7b72-Tff7b72> Tffa657Unit

Tff7b72is Te6edf3OfflineDownloadStateTb4b4b4.Te6edf3InProgress Tff7b72-Tff7b72> Tb4b4b4{
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3top Tff7b72= T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3map_offline_downloading_progressTb4b4b4, Te6edf3stateTb4b4b4.Te6edf3completedTb4b4b4, Te6edf3stateTb4b4b4.Te6edf3totalTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodySmallTb4b4b4,
Tb4b4b4)
Te6edf3LinearProgressIndicatorTb4b4b4(
Te6edf3progress Tff7b72= Tb4b4b4{ Tff7b72if Tb4b4b4(Te6edf3stateTb4b4b4.Te6edf3total Tff7b72> T79c0ff0Tb4b4b4) Te6edf3stateTb4b4b4.Te6edf3completedTb4b4b4.Te6edf3toFloatTb4b4b4(Tb4b4b4) Tff7b72/ Te6edf3stateTb4b4b4.Te6edf3total Tff7b72else T79c0ff0f Tb4b4b4}Tb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3top Tff7b72= T79c0ff2.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tff7b72is Te6edf3OfflineDownloadStateTb4b4b4.Te6edf3Complete Tff7b72-Tff7b72>
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3map_download_status_completeTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodySmallTb4b4b4,
Tb4b4b4)

Tff7b72is Te6edf3OfflineDownloadStateTb4b4b4.Te6edf3Failed Tff7b72-Tff7b72>
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3stateTb4b4b4.Te6edf3reasonTb4b4b4.Te6edf3messageResTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodySmallTb4b4b4,
Te6edf3color Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3errorTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tff7b72private Tff7b72fun Te6edf3OfflineDownloadFailureTb4b4b4.Td2a8ffmessageResTb4b4b4(Tb4b4b4) Tff7b72= Tff7b72when Tb4b4b4(Tff7b72thisTb4b4b4) Tb4b4b4{
Te6edf3OfflineDownloadFailureTb4b4b4.Te6edf3NO_BUILD_AVAILABLE Tff7b72-Tff7b72> Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3map_offline_download_failed_build
Te6edf3OfflineDownloadFailureTb4b4b4.Te6edf3TILE_LIMIT_EXCEEDED Tff7b72-Tff7b72> Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3map_offline_download_failed_tile_limit
Te6edf3OfflineDownloadFailureTb4b4b4.Te6edf3REGION_LIMIT_EXCEEDED Tff7b72-Tff7b72> Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3map_offline_download_failed_region_limit
Te6edf3OfflineDownloadFailureTb4b4b4.Te6edf3STORAGE_LIMIT_EXCEEDED Tff7b72-Tff7b72> Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3map_offline_download_failed_storage
Te6edf3OfflineDownloadFailureTb4b4b4.Te6edf3IO_ERROR Tff7b72-Tff7b72> Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3map_offline_download_failed_io
Tb4b4b4}

Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLongParameterListTa5d6ff"Tb4b4b4)
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffOfflineRegionRowTb4b4b4(
Te6edf3regionTb4b4b4: Te6edf3OfflineRegionTb4b4b4,
Te6edf3onDeleteTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3terrainDownloadEnabledTb4b4b4: Tffa657BooleanTb4b4b4,
Te6edf3terrainDownloadStateTb4b4b4: Te6edf3TerrainDownloadState?Tb4b4b4,
Te6edf3isDownloadingTerrainTb4b4b4: Tffa657BooleanTb4b4b4,
Te6edf3terrainHillshadeEnabledTb4b4b4: Tffa657BooleanTb4b4b4,
Te6edf3terrainContoursEnabledTb4b4b4: Tffa657BooleanTb4b4b4,
Te6edf3onDownloadTerrainTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onToggleHillshadeTb4b4b4: Tb4b4b4(Tffa657BooleanTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onToggleContoursTb4b4b4: Tb4b4b4(Tffa657BooleanTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3vertical Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3RowTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3verticalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterVerticallyTb4b4b4,
Te6edf3horizontalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3SpaceBetweenTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Te6edf3REGION_ROW_TEXT_FRACTIONTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(Te6edf3text Tff7b72= Te6edf3regionTb4b4b4.Te6edf3labelTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodyLargeTb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3map_cache_tilesTb4b4b4, Te6edf3regionTb4b4b4.Te6edf3tileCountTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodySmallTb4b4b4,
Te6edf3color Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3onSurfaceVariantTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3IconButtonTb4b4b4(Te6edf3onClick Tff7b72= Te6edf3onDeleteTb4b4b4) Tb4b4b4{
Te6edf3IconTb4b4b4(Te6edf3imageVector Tff7b72= Te6edf3MeshtasticIconsTb4b4b4.Te6edf3DeleteTb4b4b4, Te6edf3contentDescription Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3deleteTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

T8b949e// Rendering only ever shows terrain for whichever single region currently covers the viewport (see
T8b949e// MapViewModel.offlineRegionCovering), so these two switches are global toggles, not per-region state —
T8b949e// every terrain-having row reflects/controls the same MapViewModel.terrainHillshadeEnabled/ContoursEnabled.
Tff7b72if Tb4b4b4(Te6edf3regionTb4b4b4.Te6edf3hasTerrainTb4b4b4) Tb4b4b4{
Te6edf3TerrainToggleRowTb4b4b4(
Te6edf3label Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3map_overlay_hillshadeTb4b4b4)Tb4b4b4,
Te6edf3checked Tff7b72= Te6edf3terrainHillshadeEnabledTb4b4b4,
Te6edf3onCheckedChange Tff7b72= Te6edf3onToggleHillshadeTb4b4b4,
Tb4b4b4)
Te6edf3TerrainToggleRowTb4b4b4(
Te6edf3label Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3map_offline_terrain_contoursTb4b4b4)Tb4b4b4,
Te6edf3checked Tff7b72= Te6edf3terrainContoursEnabledTb4b4b4,
Te6edf3onCheckedChange Tff7b72= Te6edf3onToggleContoursTb4b4b4,
Tb4b4b4)
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3isDownloadingTerrainTb4b4b4) Tb4b4b4{
Te6edf3TerrainDownloadStatusLineTb4b4b4(Te6edf3terrainDownloadStateTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3TextButtonTb4b4b4(Te6edf3onClick Tff7b72= Te6edf3onDownloadTerrainTb4b4b4, Te6edf3enabled Tff7b72= Te6edf3terrainDownloadEnabledTb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3map_offline_download_terrainTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffTerrainToggleRowTb4b4b4(Te6edf3labelTb4b4b4: Tffa657StringTb4b4b4, Te6edf3checkedTb4b4b4: Tffa657BooleanTb4b4b4, Te6edf3onCheckedChangeTb4b4b4: Tb4b4b4(Tffa657BooleanTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4) Tb4b4b4{
Te6edf3RowTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3verticalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterVerticallyTb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3labelTb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodySmallTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Te6edf3REGION_ROW_TEXT_FRACTIONTb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3SwitchTb4b4b4(Te6edf3checked Tff7b72= Te6edf3checkedTb4b4b4, Te6edf3onCheckedChange Tff7b72= Te6edf3onCheckedChangeTb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffTerrainDownloadStatusLineTb4b4b4(Te6edf3stateTb4b4b4: Te6edf3TerrainDownloadState?Tb4b4b4) Tb4b4b4{
Tff7b72when Tb4b4b4(Te6edf3stateTb4b4b4) Tb4b4b4{
Tff7b72null Tff7b72-Tff7b72> Tffa657Unit

Tff7b72is Te6edf3TerrainDownloadStateTb4b4b4.Te6edf3InProgress Tff7b72-Tff7b72> Tb4b4b4{
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3top Tff7b72= T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72=
Te6edf3stringResourceTb4b4b4(
Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3map_offline_terrain_downloading_progressTb4b4b4,
Te6edf3stateTb4b4b4.Te6edf3completedTb4b4b4,
Te6edf3stateTb4b4b4.Te6edf3totalTb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodySmallTb4b4b4,
Tb4b4b4)
Te6edf3LinearProgressIndicatorTb4b4b4(
Te6edf3progress Tff7b72= Tb4b4b4{ Tff7b72if Tb4b4b4(Te6edf3stateTb4b4b4.Te6edf3total Tff7b72> T79c0ff0Tb4b4b4) Te6edf3stateTb4b4b4.Te6edf3completedTb4b4b4.Te6edf3toFloatTb4b4b4(Tb4b4b4) Tff7b72/ Te6edf3stateTb4b4b4.Te6edf3total Tff7b72else T79c0ff0f Tb4b4b4}Tb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3top Tff7b72= T79c0ff2.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tff7b72is Te6edf3TerrainDownloadStateTb4b4b4.Te6edf3Complete Tff7b72-Tff7b72>
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3map_offline_terrain_download_completeTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodySmallTb4b4b4,
Tb4b4b4)

Tff7b72is Te6edf3TerrainDownloadStateTb4b4b4.Te6edf3Failed Tff7b72-Tff7b72>
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3stateTb4b4b4.Te6edf3reasonTb4b4b4.Te6edf3messageResTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodySmallTb4b4b4,
Te6edf3color Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3errorTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tff7b72private Tff7b72fun Te6edf3TerrainDownloadFailureTb4b4b4.Td2a8ffmessageResTb4b4b4(Tb4b4b4) Tff7b72= Tff7b72when Tb4b4b4(Tff7b72thisTb4b4b4) Tb4b4b4{
Te6edf3TerrainDownloadFailureTb4b4b4.Te6edf3TILE_LIMIT_EXCEEDED Tff7b72-Tff7b72> Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3map_offline_terrain_download_failed_tile_limit
Te6edf3TerrainDownloadFailureTb4b4b4.Te6edf3IO_ERROR Tff7b72-Tff7b72> Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3map_offline_terrain_download_failed_io
Tb4b4b4}

Tf0883e@Composable
Tff7b72private Tff7b72fun Te6edf3OfflineRegionTb4b4b4.Td2a8fflabelTb4b4b4(Tb4b4b4)Tb4b4b4: Tffa657String Tb4b4b4{
Tff7b72val Te6edf3lat Tff7b72= Te6edf3NumberFormatterTb4b4b4.Te6edf3formatTb4b4b4(Tb4b4b4(Te6edf3southLat Tff7b72* Te6edf3COORD_SCALETb4b4b4)Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4) Tff7b72/ Te6edf3COORD_SCALETb4b4b4, Te6edf3COORD_DECIMALSTb4b4b4)
Tff7b72val Te6edf3lon Tff7b72= Te6edf3NumberFormatterTb4b4b4.Te6edf3formatTb4b4b4(Tb4b4b4(Te6edf3westLon Tff7b72* Te6edf3COORD_SCALETb4b4b4)Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4) Tff7b72/ Te6edf3COORD_SCALETb4b4b4, Te6edf3COORD_DECIMALSTb4b4b4)
Tff7b72return Te6edf3stringResourceTb4b4b4(
Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3map_offline_region_labelTb4b4b4,
Te6edf3latTb4b4b4,
Te6edf3lonTb4b4b4,
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3map_zoom_levelsTb4b4b4, Te6edf3minZoomTb4b4b4, Te6edf3maxZoomTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}

Tff7b72private Tff7b72const Tff7b72val Te6edf3REGION_ROW_TEXT_FRACTION Tff7b72= T79c0ff0.8f
Tff7b72private Tff7b72const Tff7b72val Te6edf3COORD_SCALE Tff7b72= T79c0ff1T79c0ff0T79c0ff0.0
Tff7b72private Tff7b72const Tff7b72val Te6edf3COORD_DECIMALS Tff7b72= T79c0ff2

Served by rngit 1.5.2 - Generated in 0.09s